From 7912643e8f2f7a98d625ce99e8a924b1a2fd744c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 11 Jul 2005 16:39:44 +0000 Subject: [PATCH] Make double-clicking between words select whitespace. (#309860, Mike 2005-07-11 Matthias Clasen * gtk/gtktextview.c (extend_selection): Make double-clicking between words select whitespace. (#309860, Mike Miller, patch by Paolo Borelli) --- ChangeLog | 4 ++ ChangeLog.pre-2-10 | 4 ++ ChangeLog.pre-2-8 | 4 ++ gtk/gtktextview.c | 125 +++++++++++++++++++++++++-------------------- 4 files changed, 83 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index 37a57d653d..a73479ad30 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2005-07-11 Matthias Clasen + * gtk/gtktextview.c (extend_selection): Make double-clicking + between words select whitespace. (#309860, Mike Miller, patch + by Paolo Borelli) + * gtk/gtkiconview.c: Documentation improvements. (#309946, Torsten Schoenfeld) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 37a57d653d..a73479ad30 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,9 @@ 2005-07-11 Matthias Clasen + * gtk/gtktextview.c (extend_selection): Make double-clicking + between words select whitespace. (#309860, Mike Miller, patch + by Paolo Borelli) + * gtk/gtkiconview.c: Documentation improvements. (#309946, Torsten Schoenfeld) diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 37a57d653d..a73479ad30 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,5 +1,9 @@ 2005-07-11 Matthias Clasen + * gtk/gtktextview.c (extend_selection): Make double-clicking + between words select whitespace. (#309860, Mike Miller, patch + by Paolo Borelli) + * gtk/gtkiconview.c: Documentation improvements. (#309946, Torsten Schoenfeld) diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 2a11b9ef91..9a1aa73007 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -5520,17 +5520,17 @@ typedef enum /* * Move @start and @end to the boundaries of the selection unit (indicated by - * @granularity) which contained @start initially. Return whether @start was - * contained in a selection unit at all (which may not be the case for words). + * @granularity) which contained @start initially. + * If the selction unit is SELECT_WORDS and @start is not contained in a word + * the selection is extended to all the white spaces between the end of the + * word preceding @start and the start of the one following. */ -static gboolean +static void extend_selection (GtkTextView *text_view, SelectionGranularity granularity, GtkTextIter *start, GtkTextIter *end) { - gboolean extend = TRUE; - *end = *start; if (granularity == SELECT_WORDS) @@ -5547,7 +5547,30 @@ extend_selection (GtkTextView *text_view, } } else - extend = FALSE; + { + GtkTextIter tmp; + + tmp = *start; + if (gtk_text_iter_backward_visible_word_start (&tmp)) + gtk_text_iter_forward_visible_word_end (&tmp); + + if (gtk_text_iter_get_line (&tmp) == gtk_text_iter_get_line (start)) + *start = tmp; + else + gtk_text_iter_set_line_offset (start, 0); + + tmp = *end; + if (!gtk_text_iter_forward_visible_word_end (&tmp)) + gtk_text_iter_forward_to_end (&tmp); + + if (gtk_text_iter_ends_word (&tmp)) + gtk_text_iter_backward_visible_word_start (&tmp); + + if (gtk_text_iter_get_line (&tmp) == gtk_text_iter_get_line (end)) + *end = tmp; + else + gtk_text_iter_forward_to_line_end (end); + } } else if (granularity == SELECT_LINES) { @@ -5570,8 +5593,6 @@ extend_selection (GtkTextView *text_view, gtk_text_view_forward_display_line_end (text_view, end); } } - - return extend; } static gint @@ -5602,63 +5623,59 @@ selection_motion_event_handler (GtkTextView *text_view, GdkEventMotion *event, g event->x + text_view->xoffset, event->y + text_view->yoffset); - if (extend_selection (text_view, granularity, &start, &end)) - { - /* Extend selection */ - gtk_text_buffer_get_iter_at_mark (buffer, - &ins, - gtk_text_buffer_get_insert (buffer)); - gtk_text_buffer_get_iter_at_mark (buffer, + extend_selection (text_view, granularity, &start, &end); + + /* Extend selection */ + gtk_text_buffer_get_iter_at_mark (buffer, + &ins, + gtk_text_buffer_get_insert (buffer)); + gtk_text_buffer_get_iter_at_mark (buffer, &bound, gtk_text_buffer_get_selection_bound (buffer)); - if (gtk_text_iter_compare (&ins, &bound) < 0) - { - old_start = ins; - old_end = bound; - } - else - { - old_start = bound; - old_end = ins; - } - - if (gtk_text_iter_compare (&start, &old_start) < 0) - { - /* newly selected unit before the current selection */ - ins = start; - bound = old_end; - } - else if (gtk_text_iter_compare (&old_end, &end) < 0) - { - /* newly selected unit after the current selection */ - ins = end; - bound = old_start; - } - else if (gtk_text_iter_equal (&ins, &old_start)) - { - /* newly selected unit inside the current selection - at the start */ - if (!gtk_text_iter_equal (&ins, &start)) - ins = end; - } - else - { - /* newly selected unit inside the current selection - at the end */ - if (!gtk_text_iter_equal (&ins, &end)) - ins = start; - } + if (gtk_text_iter_compare (&ins, &bound) < 0) + { + old_start = ins; + old_end = bound; + } + else + { + old_start = bound; + old_end = ins; + } - gtk_text_buffer_select_range (buffer, &ins, &bound); + if (gtk_text_iter_compare (&start, &old_start) < 0) + { + /* newly selected unit before the current selection */ + ins = start; + bound = old_end; + } + else if (gtk_text_iter_compare (&old_end, &end) < 0) + { + /* newly selected unit after the current selection */ + ins = end; + bound = old_start; + } + else if (gtk_text_iter_equal (&ins, &old_start)) + { + /* newly selected unit inside the current selection at the start */ + if (!gtk_text_iter_equal (&ins, &start)) + ins = end; + } + else + { + /* newly selected unit inside the current selection at the end */ + if (!gtk_text_iter_equal (&ins, &end)) + ins = start; } + gtk_text_buffer_select_range (buffer, &ins, &bound); + gtk_text_view_scroll_mark_onscreen (text_view, gtk_text_buffer_get_mark (buffer, "insert")); } - /* If we had to scroll offscreen, insert a timeout to do so * again. Note that in the timeout, even if the mouse doesn't * move, due to this scroll xoffset/yoffset will have changed -- 2.30.2